﻿###########################################
#
#  Octo-jam 2019
#
#  A casual Chip8 game jam.
#
#  This title card reprises full-screen
#  pre-baked animation, using data prepared
#  with a new tool, EZ-Bake Animator:
#
#  http://beyondloom.com/tools/ezbake.html
#
#  The program which generated these frames
#  is as follows:
#
#	g.beginPath()
#	var r = 15
#	var s = 6
#	for(var x=0; x<s+1; x++) {
#		var a = (2*Math.PI/s*x) + (2*Math.PI/s/F*f)
#		g.lineTo(48+r*Math.cos(a),15+r*Math.sin(a))
#	}
#	g.fill()
#	g.xor(true)
#	g.font = '14px Arial bold'
#	g.fillText('Octo',f*1.5-2,12+f)
#	g.fillText('Jam',8-f*1.2,22+f*2)
#	g.textBaseline = 'middle'
#	g.textAlign = 'center'
#	g.font = (20+8*Math.sin(f))+'px Arial bold'
#	g.fillText('6',48,16)
#
###########################################

: main
	v1 := 8
	v2 := 16
	v3 := 24
	v4 := 32
	v5 := 40
	v6 := 48
	v7 := 56
	vA := 1
	vB := 15
	i  := init
	frame
	loop
		i := frame1  frame
		i := frame2  frame
		i := frame3  frame
		i := frame0  frame
	again

:macro slice X {
	sprite X vA 15  i += vB
	sprite X v2 15  i += vB
}

: frame
	# by pre-initializing a matrix of coordinates in registers,
	# we can perform the drawing sequence in an unrolled loop
	# using the absolute minimum of instructions, minimizing flicker
	# on even very slow interpreters like the VIP.
	slice v0
	slice v1
	slice v2
	slice v3
	slice v4
	slice v5
	slice v6
	slice v7

	# and since we expect to run very fast,
	# we need to eat some time using the delay timer:
	loop
		vF := delay
		if vF != 0 then
	again
	vF := 7
	delay := vF
;

# the cycled frames have been XOR-masked against their predecessors,
# so we just need to prime the display by drawing a clean frame to start.
# every frame is packed top-to-bottom, left-to-right in strips of 8x15 sprites.

: init
	0x00 0x00 0x7C 0xEE 0x83 0x83 0x83 0x83 0x83 0xC7 0xFE 0x7C 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x1E 0x3F 0x73 0x60 0x60 0x73 0x3F 0x1E 0x06 0x06 0x06
	0x06 0x06 0x06 0x46 0xEE 0x7C 0x78 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x10 0x30 0x78 0x79 0x33 0x33 0x33 0x33 0x3B 0x39 0x00 0x00 0x3C
	0x7C 0x4E 0x3E 0x7E 0xCE 0xFE 0x7E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0xE0 0xF8 0x98 0x18 0x18 0x18 0xF8 0xF0 0x00 0x00 0xDD
	0xFF 0xEE 0xCE 0xC6 0xC6 0xC6 0xC6 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x01 0x03 0x03 0x07 0x07 0x0F 0x0F 0x1F 0x3F 0x3F 0xBF
	0x9F 0x5F 0x5F 0x7F 0x6F 0x6F 0x67 0x07 0x03 0x03 0x01 0x00 0x00 0x00 0x00
	0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFE 0xF8 0xF0 0xF1 0xE3 0xE3 0xE0
	0xE0 0xE1 0xE3 0xE3 0xE1 0xF0 0xF0 0xF8 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x00
	0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x7F 0x1F 0x0F 0x8F 0xFF 0xFF 0x1F
	0x0F 0x8F 0x8F 0x8F 0x8F 0x0F 0x1F 0x3F 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x00
	0x00 0x00 0x00 0x00 0x80 0xC0 0xC0 0xE0 0xE0 0xF0 0xF0 0xF8 0xFC 0xFC 0xFE
	0xFE 0xFC 0xFC 0xF8 0xF0 0xF0 0xE0 0xE0 0xC0 0xC0 0x80 0x00 0x00 0x00 0x00
	
: frame0
	0x00 0x00 0x7C 0xEE 0x83 0x84 0x8C 0x9F 0x9B 0xDF 0xE6 0x64 0x1C 0x0F 0x07
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x06 0x07 0x03 0x00 0x00
	0x00 0x00 0x00 0x00 0x1E 0xDF 0x83 0x50 0x59 0x48 0x04 0x2D 0x75 0xF5 0xC7
	0x06 0x06 0x06 0x26 0x8E 0x1F 0x1F 0x64 0x63 0x67 0x6E 0xE7 0xC7 0x00 0x00
	0x00 0x00 0x10 0x30 0x78 0x78 0x30 0xD4 0xC4 0x00 0x38 0x3A 0x1B 0xF3 0xCF
	0x7C 0x4E 0x3E 0x7E 0xCE 0x3B 0x91 0x6E 0xEE 0xEE 0x6E 0xEE 0xEE 0x00 0x00
	0x00 0x00 0x00 0x00 0xE0 0xF8 0x98 0x97 0x87 0x21 0xC9 0xC0 0x39 0x9F 0x12
	0xFF 0xEE 0xCE 0xC6 0xC6 0x1A 0x38 0x66 0x66 0x66 0x66 0x66 0x66 0x00 0x00
	0x00 0x00 0x00 0x00 0x02 0x04 0x04 0x00 0x88 0xC0 0xC0 0xC0 0xE0 0xA0 0xA0
	0xA0 0x60 0x60 0x40 0x50 0x70 0x68 0x00 0x00 0x02 0x01 0x00 0x00 0x00 0x00
	0x00 0x00 0xF0 0x80 0x00 0x00 0x00 0x00 0x02 0x08 0x00 0x10 0x00 0x01 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x80 0xC0 0x1F 0x00
	0x00 0xF8 0x03 0x01 0x00 0x00 0x00 0x00 0x60 0x10 0x80 0x48 0x00 0xE0 0x10
	0x00 0x48 0x48 0x48 0x48 0x08 0x10 0x20 0x00 0x00 0x00 0x01 0x0F 0x00 0x00
	0x00 0x00 0x00 0x00 0x80 0x40 0x00 0x00 0x10 0x08 0x0C 0x04 0x00 0x00 0x02
	0x06 0x04 0x04 0x00 0x00 0x00 0x10 0x00 0x20 0x20 0x40 0x00 0x00 0x00 0x00

: frame1
	0x00 0x00 0x7C 0xD1 0xFC 0x62 0x42 0x42 0x42 0x06 0x1D 0x03 0x3E 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x9E 0xB8 0xBC 0xB9 0xB8 0xEB 0xA7 0x81 0x09 0x06 0x1E
	0x1E 0x1E 0x1F 0x5E 0xF6 0xE5 0xE1 0xF9 0xF0 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x10 0x38 0x60 0x45 0x8F 0xAA 0x2A 0x2A 0xE2 0xA5 0x9E 0x00 0x3C
	0x7C 0xBF 0xC7 0xE7 0xB7 0x07 0xE7 0xF9 0xFD 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0xE0 0x80 0x64 0xD6 0x96 0x9E 0x36 0x0C 0x78 0x00 0xDD
	0xFF 0x55 0x31 0x1A 0x5A 0x4A 0x4A 0x8C 0x8C 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x01 0x02 0x00 0x00 0x08 0x10 0x30 0x20 0x00 0x00 0x80
	0x80 0xC0 0x80 0xA0 0xA0 0xA0 0xA8 0xC0 0xC4 0x04 0x02 0x00 0x00 0x00 0x00
	0x00 0x1F 0xC0 0x80 0x00 0x01 0x0F 0x1F 0x1E 0x3B 0x33 0x76 0x65 0x63 0x60
	0x61 0x62 0x60 0x60 0x62 0x33 0x31 0x18 0x1F 0x07 0x00 0x80 0xF0 0x00 0x00
	0x00 0x00 0x0F 0x01 0x00 0xC0 0xF0 0xF8 0x78 0x9C 0xC8 0x70 0xC0 0xF0 0x18
	0x8C 0x4C 0x4C 0x4C 0x4C 0xCC 0x9C 0x38 0xF0 0xE0 0x00 0x01 0x03 0xF8 0x00
	0x00 0x00 0x00 0x00 0x40 0x20 0x20 0x00 0x10 0x00 0x00 0x00 0x04 0x04 0x06
	0x02 0x00 0x00 0x04 0x0C 0x08 0x10 0x00 0x00 0x40 0x80 0x00 0x00 0x00 0x00

: frame2
	0x00 0x00 0x00 0x3F 0x70 0xDC 0xF1 0xF1 0xF1 0xF1 0xD3 0x47 0x21 0x0F 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x03 0x03 0x03 0x01 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x47 0xAC 0xBE 0xB6 0xF4 0xF4 0x71 0xC8 0x83 0x18
	0x18 0x28 0x29 0x29 0x2B 0xA8 0xA9 0xCA 0xC3 0xF3 0xE1 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x08 0x1A 0x3A 0x73 0x76 0x7F 0x1F 0xDF 0xFA 0x79 0xC7 0x00
	0x00 0xF1 0xF9 0x7A 0x8A 0xCA 0x6A 0x0A 0xCE 0xF3 0xFB 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x78 0xE0 0xF1 0xFD 0xE5 0xAD 0x9F 0x07 0x3E 0x00
	0x00 0xBB 0xFF 0x3B 0x63 0xB7 0xBD 0xBD 0xBD 0x31 0x31 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x02 0x04 0x18 0x10 0x00 0x20 0x20 0x20 0x20 0x20
	0x00 0x80 0xC0 0xC0 0xD0 0x50 0x50 0x58 0x40 0x84 0x83 0x00 0x00 0x00 0x00
	0x01 0x18 0x30 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x07 0x01
	0x80 0xE0 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x0C 0x18 0x80
	0x00 0x00 0x00 0x00 0xC0 0x20 0x00 0x18 0x08 0x08 0x08 0x00 0x00 0x00 0x00
	0x04 0x04 0x04 0x04 0x04 0x00 0x08 0x18 0x20 0x40 0x00 0x00 0x00 0x00 0x00

: frame3
	0x00 0x00 0x00 0x00 0x0F 0x3A 0x3F 0x2C 0x28 0x28 0x28 0x20 0x03 0x00 0x07
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x03 0x07 0x07 0x07 0x03 0x00 0x00
	0x00 0x00 0x00 0x00 0x80 0x20 0x93 0x57 0x57 0x57 0x57 0xDD 0xB4 0x70 0xC1
	0x00 0x30 0x30 0x51 0x53 0x52 0x57 0x57 0x50 0x94 0x8F 0xE7 0xC7 0x00 0x00
	0x00 0x00 0x00 0x00 0x02 0x07 0xCC 0x08 0x91 0x35 0x05 0x65 0xFC 0x34 0xF3
	0x00 0x00 0x00 0xE3 0xF3 0xF6 0x1C 0x9D 0xDD 0x1D 0x95 0xEE 0xEE 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x1C 0xB0 0xEC 0x5A 0x52 0x53 0x46 0xA1 0xCF
	0x00 0x00 0x00 0xE7 0xFF 0xE7 0xCF 0x57 0x57 0x57 0x57 0x66 0x66 0x00 0x00
	0x00 0x00 0x00 0x00 0x03 0x04 0x00 0x18 0x90 0xD0 0xD0 0xC0 0xC0 0x80 0x00
	0x20 0x20 0x20 0x20 0x20 0x80 0x90 0x98 0x84 0x82 0x80 0x00 0x00 0x00 0x00
	0x01 0x07 0x00 0x40 0x00 0x01 0x0F 0x1F 0x1C 0x33 0x33 0x66 0x65 0x62 0x60
	0x61 0x62 0x60 0x60 0x62 0x33 0x31 0x1C 0x1F 0x07 0x00 0x40 0x30 0x18 0x01
	0x80 0x18 0x0C 0x02 0x00 0xC0 0xF0 0xF8 0x18 0x8C 0x48 0x38 0xC0 0x10 0x08
	0x8C 0x04 0x04 0x04 0x04 0xC4 0x8C 0x18 0xF0 0xE0 0x00 0x02 0x00 0xE0 0x80
	0x00 0x00 0x00 0x00 0x00 0x40 0x20 0x18 0x08 0x00 0x04 0x04 0x04 0x04 0x04
	0x00 0x00 0x00 0x00 0x08 0x08 0x08 0x18 0x00 0x20 0xC0 0x00 0x00 0x00 0x00

